package com.gtja.beoms.utils;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.gtja.beoms.base.StringFormatType;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * @ClassName: DateUtils
 * @Description: 日期工具类
 * @Author: Li
 * @Date: 2021.05.24
 * @Version: 1.0
 **/
public class DateUtils {

    /**
     * 常用dateFormat
     */
    public static final String[] DateFormatStr =
            {
                    StringFormatType.DATE_FORMAT_DATETIME.format(),
                    StringFormatType.DATE_FORMAT_TIME.format(),
                    StringFormatType.DATE_FORMAT_YEAR_MON_DAY.format(),
                    StringFormatType.DATE_FORMAT_YEAR_MON.format(),
                    StringFormatType.DATE_FORMAT_FYEAR_MON.format(),
                    StringFormatType.DATE_FORMAT_YY_MM_DD.format(),
                    StringFormatType.DATE_FORMAT_YY_M_D.format(),
                    StringFormatType.DATE_FORMAT_YYYY_MM_DD.format(),
                    StringFormatType.DATE_FORMAT_YYYY_M_D.format(),
                    StringFormatType.DATE_FORMAT_YY__MM__DD.format(),
                    StringFormatType.DATE_FORMAT_YY__M__D.format(),
                    StringFormatType.DATE_FORMAT_YYYY__MM__DD.format(),
                    StringFormatType.DATE_FORMAT_YYYY__M__D.format(),
                    StringFormatType.DATE_FORMAT_YYYY__MM__DD__HH_MM_SS_SSS.format(),
                    StringFormatType.DATE_FORMAT_YYYYMMDD.format(),
                    StringFormatType.DATE_FORMAT_YYYYMM.format(),
                    StringFormatType.DATE_FORMAT_YYYYMMDDHHMMSS.format(),
                    StringFormatType.DATE_FORMAT_YYYY_MM.format(),
                    StringFormatType.DATE_FORMAT_DDMMMYYYY.format(),
                    StringFormatType.DATE_FORMAT_DDMMMYY.format(),
                    StringFormatType.DATE_FORMAT_YYMM.format(),
                    StringFormatType.DATE_FORMAT_DD__MM__YYYY.format(),
                    StringFormatType.DATE_FORMAT_DD_MMM_YYYY.format(),
                    StringFormatType.DATE_FORMAT_DDMMMYYYYHHMMSSSSS.format()
            };

    /**
     * @Description: 比较两个时间相差天数
     * @Author: Li
     * @Param: [time1, time2]
     * @Date: 2021/5/24 10:47
     * @returns: float
     */
    public static float calculateTimeGapDay(Date time1, Date time2) {
        float day = 0;
        try {
            Date date1, date2;
            date1 = time1;
            date2 = time2;
            long millisecond = date2.getTime() - date1.getTime();
            day = millisecond / (24 * 60 * 60 * 1000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (day);
    }

    /**
     * @Description: 根据当前日期获得所在周的日期区间(周一和周日日期)
     * @Author: Li
     * @Param: [date]
     * @Date: 2021/5/24 11:55
     * @returns: java.lang.String
     */
    public static String getTimeInterval(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        // 判断要计算的日期是否是周日，如果是则减一天计算周六的，否则会出问题，计算到下一周去了
        int dayWeek = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天
        if (1 == dayWeek) {
            cal.add(Calendar.DAY_OF_MONTH, -1);
        }
        // 设置一个星期的第一天，按中国的习惯一个星期的第一天是星期一
        cal.setFirstDayOfWeek(Calendar.MONDAY);
        // 获得当前日期是一个星期的第几天
        int day = cal.get(Calendar.DAY_OF_WEEK);
        // 根据日历的规则，给当前日期减去星期几与一个星期第一天的差值
        cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);
        String imptimeBegin = sdf.format(cal.getTime());
        // System.out.println("所在周星期一的日期：" + imptimeBegin);
        cal.add(Calendar.DATE, 6);

        String imptimeEnd = sdf.format(cal.getTime());
        // System.out.println("所在周星期日的日期：" + imptimeEnd);
        return imptimeBegin + "," + imptimeEnd;
    }

    /**
     * 在原日期的基础上增加天数
     *
     * @param date
     * @param i
     * @return      
     */
    public static Date addDayOfDate(Date date, int i) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(Calendar.DATE, i);
        Date newDate = c.getTime();
        return newDate;
    }

    /**
     * 获得上周的第一天
     * @return Date
     */
    public static Date getLastWeekMonday() {
        Date now = new Date();
        DateTime oneWeekBeforeNow = DateUtil.offsetDay(now, -7);
        DateTime beginOfWeekBeforeNow = DateUtil.beginOfWeek(oneWeekBeforeNow);
        return beginOfWeekBeforeNow.toJdkDate();
    }

    /**
     * 获得上周的最后一天
     * @return Date
     */
    public static Date getLastWeekSunday() {
        Date now = new Date();
        DateTime oneWeekBeforeNow = DateUtil.offsetDay(now, -7);
        DateTime endOfWeekBeforeNow = DateUtil.endOfWeek(oneWeekBeforeNow);
        return endOfWeekBeforeNow.toJdkDate();
    }
}
